Penguin logo! :o) Seriously, the major advantage of the framebuffer devices is that it presents a generic interface across all platforms. It was the case until late in the 2.1.x kernel development process that the x86 platform had console drivers completely different from the other console drivers for other platforms. With the introduction of the 2.1.109 kernel, all this has changed for the better, and introduced more uniform handling of the console under the x86 platforms and also introduced true bitmapped graphical consoles bearing the Penguin logo on x86 for the first time, and allowed code to be shared across different platforms. Note that 2.0.x kernels do not support framebuffer devices, but it is possible someday someone will backport the code from the 2.1.x kernels to 2.0.x kernels. There is an exception to that rule in that the 0.9.x kernel port for m68k platforms does have the framebuffer device support included.
With the release of the 2.2.x kernels, framebuffer device support is very solid and stable. You should use the framebuffer device if your graphic card supports it, if you are using 2.2.x kernels. Older 2.0.x kernels does not support framebuffer devices, at least on the x86 platform.
0.9.x - introduced m68k framebuffer devices. Note that m68k 0.9.x is functionally equivalent to x86 1.0.9 (plus 1.2.x enhancements)
2.1.107 - introduced x86 framebuffer/new console devices and added generic support, without scrollback buffer support.
2.1.113 - scrollback buffer support added to vgacon.
2.1.116 - scrollback buffer support added to vesafb.
2.2.x - includes matroxfb (Matrox cards) and atyfb (ATI cards).
There are some cool features of the framebuffer devices, in that you can give generic options to the kernel at bootup-time, including options specific to a particular framebuffer device. These are:
video=xxx:off - disable probing for a particular framebuffer device
video=map:octal-number - maps the virtual consoles (VCs) to framebuffer (FB) devices
video=map:01 will map VC0 to FB0, VC1 to FB1, VC2 to FB0, VC3 to FB1...
video=map:0132 will map VC0 to FB0, VC1 to FB1, VC2 to FB3, VC4 to FB2, VC5 to FB0...
Normally framebuffer devices are probed for in the order specified in the kernel, but by specifying the video=xxx option, you can add the specific framebuffer device you want probed before the others specified in the kernel.