Why is my planning time consistently slower than execution time?
The only time I see planning times that slow for such simple queries is the first time a table is used in a given connection.  Then it has to read the metadata about the table and its indexes and statistics, perhaps from disk.

Is that is actually a problem?  If so, you could use a connection pooler so you re-use the connections with the metadata already in memory.