The problem I've been having is with textures - nothing is guarenteed about what textures will be needed, so we can't create a GUI texture palette. Which ultimately means state changes. Which means we can't just draw everything in a single draw call.
I think at this point I'm just going to use a strict immediate mode approach. I mean, yeah. It will be pretty nasty. But you know, it is just a GUI, after all. Though important, it isn't a vital part of the graphics pipeline. If, later on, it does bottleneck the system then I'll fix it. But at this point, anything needing an insanely complex GUI probably won't be doing any hardcore rendering, so the GUI can hog all the GPU bandwidth it needs.
I know basically everyone here has written their own GUI system - has anyone made a nice system that uses vertexbuffers to reduce the number of draw calls?