I can just ‘dnf downgrade’ to get an older version.. Why do we need modularity?
Using an older version that is no longer maintained can be dangerous, mostly because of the lack of security updates. Modules, on the other hand, represent a major version that is still being actively maintained by the upstream and therefore should receive updates.
Is this different from single app VMs with custom versions?
This helps with a single app VM with custom versions. But instead of getting them from somewhere and maintaining them yourself, there is a good chance a module with the version you need already exists and is maintained — so you can just install it. Same as with containers, it helps users to get the right version for their system.