Possible solution below (only this comment top posted).
Perhaps I am way off base here but why are you expecting runlevel 3 to not run X? Yes, that was the SysVinit definition, but has not been used in debian or ubuntu in a long time:
http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html
I think I read that Fedora, RedHat had started using upstart but I don't know whether they kept the runlevel definintions they used previously like in RH9:
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/s1-boot-init-shutdown-sysv.html
The confusion in usage of runlevels by different systems is made much clearer in this wikiperia article:
http://en.wikipedia.org/wiki/Runlevel
So again, I may be off base here, but it seems to me there is no way in ubuntu 9.04 to do what you want without editing some of the services out of some runlevel (2-5) before tryiing to enter it and expecting X not to run. IOW, runlevel 2-5 are all the same un debian/ubuntu UNLESS you change their definition first.
Hmmm, I just realized that for their server edition, they probably have done so already. I don't have ne installed to look at.
--
Dazed_75 a.k.a. Larry