Unless one's interaction with the database are really basic (i.e. a single SELECT statement), one would want to be as explicit as possible regarding where transaction boundaries are.
Having a default that hides this aspect from my code always seemed a false convenience to me.
edit: this is just a tangential reflection inspired by your comment, not an answer / nor I wanted to detract from your fact statement.
Databases that only do the technically-correct thing are weeded out because they lose the big supportive cloud of novices that experts grow out of. So the good databases support the intuitive way and the the correct way of manipulating data.
There are more computing concepts to learn than there are hours to learn it in. People use systems they don't understand and systems need to support that.
If your writes are single table and don't require transactional safety, why introduce transactions?
If you need complex, multiple-insert or update writes, transactions are great, but that can also be accomplished in a stored proc.
In a high-velocity environment, avoiding transactions are a great way to get more throughput out of your database server with lower latencies.
Combine Postgres with pgBouncer in statement mode and you can scale it pretty dramatically.
AFAIK autocommit mode just applies if you don't explicitly open a transaction, so what would you propose instead? That a transaction is silently opened but not committed (potentially leaving a dangling transaction open for a long time after SELECT statement) (like Python's odd default behaviour)? Or an immediate error?
I can certainly see that if you are indeed wrapping every individual statement in their own BEGIN/COMMIT pairs that you'd wonder why the database can't help you for such simple use cases. You can still selectively open an explicit transaction on those statements that do need to be grouped together, so I don't see that you've given up any control.