Well, quads is one way, and a pretty darn good way too. It gives you maximum flexibility, because you can do the UI as you want to. And if it’s slow, you are probably doing something wrong. Quads are as fast as standard triangles.
And to put text on a quad is not that difficult, either add the text to the texture, or use a second renderpass and add a new quad with the text.
Clicks can easily be detected with (as long as you know the mouseposition and what button is pressed) the selection mode. Just render the buttons to the selectionbuffer, and let OpenGL tell you what quad you clicked on. This works for ANY kind of button form.