Some notes on customizing runlevels:

The command line utility "update-rc.d" can be used to configure services for different runlevels. Check the manpage for details. Links in the /etc/rcN.d, where N is a single digit referring to one of the runlevels 0,1,2,3,4,5,6,S can also be manually created, deleted, or renamed to determine which init scripts run in a given runlevel.

For an easier method, I like the program sysv-rc-conf available via synaptic or apt-get. It runs as a full-screen text-mode application in a terminal. Similar programs include the gui bum (Boot-Up Manager) and the text-mode rcconf. If you use gnome, some start-up services are configurable from Main_Menu/System/Administration/Services. I don't know what KDE or other DEs offer in this regard.

Assuming you've installed sysv-rc-conf, open a terminal or vt and start the program by typing sudo sysv-rc-conf and pressing enter. For finer-tuning, use the -p option, which displays and allows edits to the sequence numbers of the service links. Without -p, the simpler enable/disable choice shown in the screenshot is presented.

Screenshot of sysv-rc-conf

Configure runlevel 3 for text-mode-only login and operation by disabling gdm. If the preload package is installed, disable that too. No point in preloading all those Xorg-related or gui programs for text mode.

Look at the other service names, will you need nvidia or other hardware services? (Maybe you don't even have an nvidia card and can disable it for all runlevels) And a default ubuntu installation starts the "brltty" service at boot, for a braille text terminal. You can probably disable that for all runlevels.

It's sometimes difficult to determine the purpose of the various services from the file names alone. You may want to look at the files contents in /etc/init.d and do other research before making any changes.

Note: Runlevel 2 through 5 are used for normal, multiuser operation and are usually the ones selected for customization. Runlevel 2 is the default in ubuntu. Runlevels S,0,1, and 6 are used for initialization, shutdown, recovery/single user mode, and rebooting. Don't change these unless you understand what you are doing.

If you've made changes to your default runlevel you may decrease your boot time by profiling. The Sysadmin's Journey explains at item 4 here and has a few other tips as well.