Prepared statements can have very visible effects apart from the speedup they provide (e.g. failure because of schema changes) It's not that these effects can't be worked around - they can be - but programmers can be surprised by these effects, which can cause difficult-to-diagnose issues.
The specific effect of "cached plan cannot change return type" can be solved by cooperation of backend and frontend (~driver) developers.
I find that solving that kind of issues is more important than investing into "ParseBindExecDeallocateInOneGo" message.
I hope you would forgive me if I just stop the discussion here.
I find I'd better spent that time on just fixing pgbouncer issue rather than discussing if it is pgbouncer's or postgresql's issue.