Ok, I just want to amend my algorithm suggestion a bit, according to the suggestions of some:
growth loop:
Pick a spot for the city.
Draw roads from city center to all other neighboring cities that exist at that time.
Expand the city from the center, without covering the initial roads, according to immigration, births.
When a new neighbor town is founded and can't easily use the existing road system, bring a road towards the current growth center but stop when it hits buildings.
Create plazas at the end of these new roads to serve as alternative town centers.
When the city is attacked, evaluate whether its wealthy and important enough to encase within a wall.
Place the gates of the city near the initial roads, and also the ones from new neighbors.
If the city has a wall, only create a new one if 60% of the town has grown beyond the gates.
Grow the town further centered around the existing gates as if it were a new town, starting the whole process again.^^
maintenance loop:
Attemp to destroy houses near the city center to make way for important new buildings and intercity roads.
Some random houses should be protected as if they were the homes of important, influential people. This is to break up the homogeny of the important public buildings near the center.
When new town centers emerge, try to create direct avenues between them by knocking down houses.
This should lead to some interesting, sensible cities.