Picking a resolution based on performance made sense back in the 90s, but today you rarely want to run a game at anything other than your native resolution or the LCD screen will make it look awful.
I'd agree about the native resolution part, but don't most current titles that support such features still choose some graphics setting level (low, medium, high, ultra), as well as the resolution, before running for the first time? perhaps as part of the launcher app? Things like texture resolution, water quality, reflections, AA sample count, shadow type (volume-metric / drop / none), etc.
Note to OP: a launcher app precludes the need for command line or data driven (IE .ini file) over-ride of auto-detect results.
As for UI's and low rez's:
i coded Caveman to 1600x900, then modified the UI to scale to current rez. tested it from 800x600 on up. looks ok (still legible) at all resolutions. But you can tell its scaled when the scale amounts (up or down) are large. multiple resolutions for the custom font bitmaps would help here. font textures are just 32x32 in size.
Long ago (when 1024x768 came along) I decide the best solution was to code UIs to a virtual 10000x10000 coord system and make them scale automatically to the current rez. I should have done that for Caveman. That way no matter what app you're writing or what resolution you're at, 0,0 is the UL corner, 10K,10K is the LR corner, and 5K,5K is the center of the screen. Scaling down (within reason) tends to not look as bad as scaling up. so a very large virtual coord system where you always scale down and there's room for future tech like 4K displays is preferable.
of course, writing a program back in the early days of 1024x768x256 whose UI could scale to 10K graphics would be of little use if the app didn't include code to actually use higher resolutions than 1024x768x256.
But it also means that any generic UI library you write that uses 10K x 10K coords will not become obsolete until resolutions get up to about 12K x 12K or 15K x 15K.
Unfortunately, games tend to use custom UI's. So you're usually stuck writing a scaleable custom UI for each game you do. something where you code using one coord size (1600x900, 10Kx10K, whatever), then convert it to screen coords based on current rez.
My solution for this has been to use just two basic ui components: getstring, and a popup menu. messages can be done with a menu whose last option is "ok". for each new game, i copy and paste those two routines into the code for the new game, and make them use the new game's graphics. The back end code never changes, just the code to draw text and bitmaps. its easier than trying to separate the back end from the graphics completely. anything more complex than getstring, menu or message, and i code up a custom dialog box/ screen of some sort.