At some level the application needs to participate in the performance conversation too.
Unless you cache query plans like other RDBMS's then the client manually managing that goes away and its not limited to a single connection.
MS SQL still has prepared statements and they really haven't been used in 20 years since it gained the ability to cache plans based on statement text.
Postgres’s PREPARE is per-connection so it’s pretty limited, and then connection poolers enter the fray and often can’t track SQL-level prepares.
And then the issue is not dissimilar to Postgres’s planner issues.