Two layers, not a choice between them
Every query that touches tenant-owned data filters on the project or organization explicitly, in application code. Row-level security in Postgres then refuses the same rows again at the database. Neither layer is a substitute for the other: the application filter is what makes the query correct, and the database policy is what catches the query that forgot.
The detail that makes it real
Postgres bypasses row-level security unconditionally for a superuser, no matter how the policy is declared. So the runtime connection role is deliberately not one — a detail that is easy to get wrong in a migration and silent when you do.