Putting Input.GetButtonDown in FixedUpdate is a bad idea anyway, because it can easily happen that the frame where GetButtonDown happened is not the frame executing in FixedUpdate, resulting in missed input. Sounds like you have logic which is basically doing this, so it’s “falling through the FixedUpdate cracks”.
So let me get this straight: I have first check the input, in FixedUpdate tell Update that the input has been read, and in Update if the input has been read, read new input.
Actually FixedUpdate doesn’t (usually) run multiple times per frame; it depends on what the frequency is. If you stick with the standard 60fps for FixedUpdate and your game is running 300fps, then you normally have FixedUpdate running once every 5 frames. So you only have a 20% chance of Input.GetButtonDown actually responding if you’re polling in FixedUpdate in this particular case. Hence the “slam my spacebar repeatedly to jump once” effect.
In low-fps situations, FixedUpdate can run multiple times per frame in order to maintain the desired frequency.