Some major, visible components to be added in 2.6 over 2.4 were ALSA, LVM2, and udev, all of which remain in modern kernels. The 2.4 kernel series also had a lot of differences over 2.2 but many of them were "half-baked" compared to where they ended up in 2.6 (e.g., input subsystem, iptables).
The evolution starting from 2.6 has been much more gradual, especially at the interface between the kernel and other code. The version numbers are not nearly as significant as they used to be. There were more fundamental changes between 2.4 and 2.6 than between 3.0 and 4.0. Instead of discrete leaps, the kernel now changes through continuous, small increments, and such a pace was made possible by the current (2.6+) kernel architecture.
Also, module loading was changed significantly; there's some documentation at https://tldp.org/HOWTO/Module-HOWTO/linuxversions.html
The evolution starting from 2.6 has been much more gradual, especially at the interface between the kernel and other code. The version numbers are not nearly as significant as they used to be. There were more fundamental changes between 2.4 and 2.6 than between 3.0 and 4.0. Instead of discrete leaps, the kernel now changes through continuous, small increments, and such a pace was made possible by the current (2.6+) kernel architecture.