One thing you might be misunderstanding: Not just what you normally consider ‘packages’ are derivations. Source code fetchs, NixOS system, your user environment… anything that Nix builds, is a derivation.
The #1 reason we use fixed-output derivations is for network downloads. Since we cannot control the network, we disable it during builds to help with reproducibility.
But what if we do need to download something? We make a compromise: if you’re a fixed-output derivation we enable network access for you, but in return tell me in advance the hash of what you’re going to download and give back as output. This way we retain reproducibility.
For ‘normal’ builds, fixed-output aren’t really designed for them. Being able to provide bit-by-bit identical builds is the ultimate ‘reproducible build’ and is very much an unsolved problem for now, even with Nix.