First of all, there are basically two types of classic framebuffer drivers:
- Generic hardware & firmware drivers (e.g. vga, vesafb/uvesafb, efifb)
- Hardware-specific drivers (e.g. rivafb, atyfb)
The classic framebuffer drivers all had basic modesetting support, but they exposed little if any support for hardware accelleration.
With the classic X design, this wasn't really an issue: to get 2D acceleration, the X server ran as root, and could access the hardware directly. It basically bypassed the framebuffer driver completely. For 3d (and 2d support on newer cards), it would also use a kernel DRM driver that mediated access and managed video memory.
In this setup, there were two places where modesetting was done: both in the kernel framebuffer driver, and in the userspace X server. This duplication of code (and occasional fighting between drivers, e.g. on VT-switch) was not ideal.
In addition, there were two separate drivers in the kernel for the same piece of hardware: the framebuffer driver and the DRM driver. In some cases (e.g. pre-kms intelfb), you could load one or the other, but not both at the same time.
KMS was the solution to these issues. It:
- Merges the kernel hardware-specific framebuffer driver and drm driver into a single driver.
- Provides an interface for the X server to use to control modesetting, so the X server doesn't have to directly access hardware. (Indeed, with KMS, the X server no longer needs root permissions.)
Some interesting notes: The migration to what is now KMS actually started around 2004; see Jon Smirl's email on console rearchitecture.
To answer your more specific questions:
- Speed generally won't be worse than one of the unaccelerated generic drivers (e.g. VGA, vesafb), but the KMS framebuffer text console was designed for convenience and emergency use rather than speed, and the console isn't fully accelerated on some drivers. Wrapped long lines are pretty bad on intel cards, for example.
- Applications designed to use the old framebuffer interfaces will still work on a KMS framebuffer.