I'm also making a menu right now and I want it to be as user friendly as possible. My game support mouse/touch, keyboard and gamepad, all at the same time, and that include inside menus too.
For the mouse, it's pretty straight foreward, I highlight the menu items on mouse-over and select on click. I had to use some of the workarounds you mentioned, especially for sub-menus in hidden layers still catching clicks (I was actually pulling my hair on this one until I realized what was really happening).
For keyboard and gamepad, each menu item has a variable named index (I created a specific family for menu items). it's a numeric value and I give each item a different number. This allow me to navigate through the menu with keyboard and gamepad, when pressing up or down, I highlight the item with next greater/lower index value. If I reach the end of the menu (no more greater index available) I jump back to the first item (the one with the lowest index). Then for selection I use the button A or enter. In case I'm in a sub-menu (options, confirm quit...) button B and Escp act as a shortcut for going back to the main menu (as well if I'm in the pause menu, this will resume the game), you don't have to move the selection to the "back" item and confirm (but you still need to keep it for mouse/touch users). This might be a bit over the top, but it's this kind of polishing that really increase the user experience overall (sure if the rest of the game is crappy, it's no need to have a fancy menu)
While all this is handled in a generic form with Families and function (I can easy create new menus and item on the fly now), I still need to specify for each menu what each item does when selected.
For that I use a variable named in the menu item, which contain a string.
Then when an item is selected, I run a function which get this variable, compare it to a bunch of keywords, and do the corresponding action:
if action = "start" -> go to layout "firstLevel"
if action = "options" -> Call Function openSubmenu("option")
...
That's when I wish there were a Switch statement