Since you ask… I’ll explain a bit better how to ‘fake’ high detail brushwork with low-detail brushwork.
In a nutshell, using a single block-shaped building as an example (which can be expanded as far as you want) you make two boxes, one the size of the ‘outer’ wall, one with the faces aligned with where the ‘window panes’ should be. The ‘window panes’ box is just that, tiled with the window panes. The ‘outer’ shell uses a masked texture to ‘fake’ the repeating windows. Decals of glow textures can be used to add ‘lit up’ windows to the window-pane layer to break up repition in this version, for instance.
Now, just those two shells would result in ‘gaps’ between the windows and the outer walls that would be obvious. The window-sill would be missing, so to speak. Now, to fix that, add individual brushes that go the length and width (seperately) of the current building, much like your current construction, but only textured on the ‘visible in the window’ edges.
Just adding these can cause Z-Fighting of the outer shell, window panes, and the window-sills. So, one more change is needed, adjusting the sorting order to make sure there are no conflicts. Window-sills first, window-panes second, outer shell last, and all the z-fighting goes away, and you’re left with approximately 4 tris per column, 4 tris per row, and 2 tris per rectangular area of windows and/or outer wall.
This technique would reduce your r_speeds down to roughly 750 when applied to the above screenshot, maybe 1500 at the highest possible if that building is meant to be viewed from all sides and all sides have roughly equal complexity and if I’m counting the columns correctly.
As I said the first time though, if you need to be able to go ‘inside’ the building, the above technique would need to be modified to support that. 
