You could use particles and collections.
Start off by copying all of your buildings (and only your buildings) and paste them in one collection. Since Blender's particle system does not support rendering objects with their children (the multiple meshes per tower), you need to apply all modifiers and join the meshes that make one building together (of course all on the pasted buildings in the new collection). After doing that, place the origins of each new building to their bottoms so they go on top of the plane rather than halfway through the plane.
Select the plane that the city will be on and go to Properties > Particle Properties and add a new Particle System. Change the type to Hair. Each hair will represent one building. Go to Emission and play around with Number and Seed until you are happy with the positions and number of hairs.
To render each hair as a building, go to Render > Render As and change it to Collection. Now, go to Render > Collection > Instance Collection and set it to the building collection. If you want some buildings to appear more often than others, also check Use Count. More count for a building means it appears more often and vice versa. To change the size of the buildings, go to Render > Scale and tweak it.
NOTE: At the time of writing (June 2020, version 2.83), Blender's particle system cannot self-collide. This means that sometimes buildings will intersect with one another. As of now, the only way to get around this is to change the seed until no buildings intersect.