By "flat" I mean this button:
http://ko.esotericsoftware.com/spine-graph#%ED%94%8C%EB%9E%AB
It looks similar to the "separate handles" button, but it's not the same. Flat is when the handles are both at the same Y position in the graph.
We would say handles can be either "straight" (the default) or "separated". I know we are speaking different languages, but I just wanted to cover this briefly so we're sure we're talking about the same things.
When the handles are flat, the scaling is simpler. Some aspects of scaling are only seen when the handles are not flat, regardless of whether then handles are separated.
Even if the spacing between frames is adjusted, I want the shape of the curve to remain the same.
This is probably what the animators want.
Actually that is not usually the case. The curves define the rate at which the keyed value changes. It's most important that the rate not change abruptly. To do that you need the handles to be straight through the key. Most of the time that is more important than keeping the relative shape of the curve as seen in the Curves view. That is why the keys are not separated by default.
Again I encourage you to use the graph more to visualize your curves. See how your curves flow throughout your entire animation is extremely useful. It's great that you are paying so much attention to the Curves view, especially when you find bugs that we can fix, but I strongly believe that the Graph view has a bigger impact on your animations. Not only that, but it allows you to better see what is happening when you move keys around -- you might find bugs more easily!
through the process of narrowing and widening the frame gap
If you scale your keys with rounding, those are the new key positions. If the keys were not moved an equal amount due to rounding and you later try to scale them back to where they were, it is likely they will be off by a frame. Scaling the keys with rounding changes the spacing between the keys, unless the scaling is evenly divisible (50%, 200%, etc).
That is expected behavior and how it works in 3.8, except I see that in 3.8 letting go of the mouse button and then scaling again remembers the original positions. If you dismiss the box selection, and make a new box selection, then you'll see the same behavior in 4+.
In 4+, after letting go of the mouse button, moving the same box selection does not use the original key positions for scaling, so you see the keys being off by 1 frame. We should be able to improve this!