Yes, I regulary use two rects over each other to draw frames.
An alternative would be using LINE_STRIP, but then the width of the frame depends on LINE_WIDTH so you can't have rounded corners and thin frames with LINE_STRIP.
Try this in EVE Screen Editor:
CLEAR_COLOR_RGB(0,0,0)
CLEAR(1, 1, 1)
LINE_WIDTH(80)
BEGIN(RECTS)
COLOR_RGB(255,215,0)
TAG(100)
VERTEX2F(1600, 1600)
VERTEX2F(3200, 2240)
TAG(110)
VERTEX2F(1600, 2560)
VERTEX2F(3200, 3200)
COLOR_RGB(0,0,0)
TAG(110)
VERTEX2F(1632, 2592)
VERTEX2F(3168, 3168)
END()
TAG(100)
COLOR_RGB(0,0,0)
CMD_TEXT(150, 120, 28, OPT_CENTER, "MUTE")
TAG(110)
COLOR_RGB(255,215,0)
CMD_TEXT(150, 180, 28, OPT_CENTER, "NEXT")
TAG(0)
As for efficiency, this sequence uses 38 32bit words on the display-list.
The only way to get away with less would be to use images for the buttons.
In contrast, a single FLAT button with the text "MUTE" uses 16 or 20 32bit words, depending on the posistion of the screen, just the button without TAG or color commands.
Doing this in discrete commands also allows to split the display list in a part that is static and therefore only needs to be transferred once (see CMD_APPEND) and the part that is transferred for every refresh because it changes.
In this example the first rectangles could be moved to the static section.
You could easily add visual feedback to this by for example not drawing the second
rectangle when the button is touched and changing the color of the text to black.