Also basic things like textures are converted to mip-maps at different levels so that in itself could double memory usage.
I'd forgotten about mipmaps - it is almost handled automatically these days compared to older engines where you might even be prebuilding mipmap levels for optimal quality.
Also your second point a lot of game engines have lazy garbage management for various reasons - playing around with my GTX780 and a 970 with similar performance levels quite a few games would hover at 2.8GB on the 780 (out of 3GB) and around 3.5GB out of the "4GB" on the 970 without any performance difference between them.