I just realized that the code to generate buildings from a string template and randomize them is so universally useful I can throw away my road generation logic completely and just add templates for all possible tiles. That's easier to manage and I can even use the randomization feature to add trees or other things to the roads.
Here, this is something I couldn't do before. I can force buildings to be adjacent to the road without any gaps. That isn't something you can get easily if you place buildings randomly (especially if buildings can span multiple tiles).
Kinda back where I was a week ago already, but now with the better algorithm that gives me way more control and variable building designs without too much effort. I still need more, but it works