Nathanial,
Have you tried using sprites? I think that you'll find that this is largely what you are looking for.
One strategy that you can use is to have the various menus you need stored into a bitmap. When your program is loading up, load a bitmap with LOAD BITMAP and then use the GET IMAGE command to get all your menus stored in memory.
During the actual game loop, use the SPRITE command to position your menus. Your sprites will be displayed over your 3D world.
If you want your menus along the right side (or the bottom, if you modify the trick) you should cache your screen co-ordinates when your game is loading too.
w = screen width()
h = screen height()
This way, you can do things like:
SPRITE 1, w-100, 0, 1
(this assumes you are placing sprite number 1, generated from image number 1, that it is 100 pixels wide and that you want it at the top of the screen).
A more advanced way to do it is to use user defined TYPES. These are your powerful friends that can store related data fields, and the beauty is that you get to choose what data they store. Here's how you can do that:
TYPE MenuDefinition
MenuName AS STRING
X AS INTEGER
Y AS INTEGER
ImageNumber AS INTEGER
SpriteNumber AS INTEGER
Visible AS INTEGER
ENDTYPE
You could then create an array of menus to use at various points through the game.
DIM GameMenus(10) AS MenuDefinition
Now, if you can write one function to draw all menus that are to be displayed, and you'll never have to worry about fancy switches or tons of repeating code.
FUNCTION DrawMenus()
FOR i = 1 TO 10
IF GameMenus(i).Visible = 1
SPRITE GameMenus(i).SpriteNumber, GameMenus(i).X, GameMenus(i).Y, GameMenus(i).ImageNumber
ENDIF
NEXT i
ENDFUNCTION
Hope this helps!
-= i only do what my rice krispies tell me to do =-