The default reading on messaging storage is that it requires a wide-column database. The reading is correct at sufficient scale. It is wrong at the scale at which most products operate, and the operational cost of the wrong choice early is meaningful.
What Postgres does well, longer than you think
Modern Postgres on modern hardware will comfortably hold tens of billions of rows in a partitioned table. Append-heavy workloads with predictable access patterns are the easiest case for it. Messaging is exactly that.
The operational cost of running Postgres is paid every day by people who already know how to run Postgres. The operational cost of running Cassandra is paid by people who have to learn first. The asymmetry compounds for years.
When to switch, and how
The signal is when your largest partition starts to exceed comfortable disk capacity on a single primary. Long before that, you will have other signals: read latency drift on the longest threads, replica lag during peak, write amplification on the busiest accounts.
When you do switch, switch the storage tier first and leave the application contracts unchanged. The migration that surprises the application is the migration that fails. The one that swaps the storage under a stable contract succeeds quietly.