Yes indeed that was something that I also didn't understand in the beginning. But in one of the above posts I have tried to explain why that happens.
If I understood correctly fps_mode is the successor of vsync. The vsync is obsolete and will be removed in the future. In the ffmpeg docs you can see that you can even pass the old vsync numeric values to the new fps_mode parameter if you like:
But you can also pass the new string values ('passthrough', 'cf', 'vfr', ...) to the new fps_mode parameter... They should offer the same behaviour.