OK… Bevel modifiers get applied when exported to realtime engines, so they create geometry anyway. A few control edges aren’t going to kill your performance if you’re already making enough geo to have smooth bevels. Performance is faces/pixel density which is why LOD’s work-- It doesn’t have to decide which face is taking up those pixels from light bounces. The more faces it has to pick from to represent less pixels than there are faces, the longer that frame takes to render.
Are you trying to avoid normal maps? Generally that’s what you would do for clean bevels, but it consumes more vRAM and requires different shader strategy. However you do it, you’ll need autosmooth enabled, sharp edges marked and possibly weighted normal modifier so it exports smooth normals. This is what is called “smoothing groups” in other DCC’s. (read more in this amazing post: Unable to bake Normals the way I want them to (Smoothing & 90° angles) - #4 by Stan_Pancakes)
A boolean would cut the bevels in while keeping the editable state of the modifier stack. So one would be the bevel modifier and the other would be the boolean. It can be a little frustrating to get sorted, but it can be helpful. You can put bevels on the boolean cutter as well as bevel modifiers on the target. Combined it can have different control methods and automatically mark edges, etc.
For smaller details, it might be enough to do it in a normal map if you’re going to use them. You can even use the bevel node for that when you bake the normal map. You can pack the hallway details of several meshes into a single texture set to save draw calls.
You might just skip the bevels and use autosmooth and/or weighted normal modifier…
and with autosmooth and a weighted normal modifier it looks like this: