I'm a bit surprised that Posgres doesn't optimize the COUNT(column) expression to not actually read the value of the column, which is not necessary. Am I missing something?
Pg has to read the xmin and xmax anyway to determine if the row is visible to your transaction (for rows without hint bits set, in pages without hint bits set).
Same - the row format itself starts with a bitmask listing all null columns. You don’t need to read the column data itself to determine if a column is null.