It very much depends on actual table and index definitions. The switch saves 4 bytes for the column - but since all storage is done in multiples of 8 bytes, this may be swallowed by alignment padding or free up 8 bytes if you are lucky.
The standard btree index backing the PK won't change in size, 4 bytes are lost to alignment padding. But if you have use for an additional 4-byte column in a covering index, that saves 8 bytes instead of just 4, which makes the index tuple 20 bytes total instead of 28.
The bigint
primary key is only the start. If there are foreign key references to it, effects are multiplied. Or you have multicolumn indexes involving multiple FK columns. Then the switch can very well result in a good speedup like you are looking for. Especially if cache memory is limited. It all depends.
If you are certain you won't burn more than 3^31 numbers (not 2^32: Postgres uses signed integer, you'd have to use the negative half too) over the lifetime of the table, and you actually save space in tables and indexes, then, by all means, switch to plain integer
. I have seen an actual difference many times. But you need some understanding of Postgres storage mechanisms before you tinker with this.
Related: