I have a complicated and challenging suggestion that just might make the game a lot more interesting.
First of all, keep the snaking cities, that is absolutely fine, however...
1. Divide the city into each individual tile, so that units will HAVE to travel at the same pace (with road bonus) through the city. This also would allow careful planning of the City to benefit from resources better.
2. Now with the multiple tiles set, it adds a new dimension to sieges. Divide the garrison in accordance to the tiles too. AKA, in terms of defence, think of one city as several cities depending on its size. This not only make sense in a real world perspective, but it also adds a new level of depth, as the enemy, or you could capture portions of the city, and benefit from buildings placed in that tile. You could even have a very interesting scenario similar to post war Germany, where two competiting factions struggle over one city.
2.5 As a side note, another addition could be implemented, is that during Sieges, if the city has city walls, perhaps these could act as destructable environment with towers depending on the grade of walls that act as a stationary unit. The stone walls and towers could only be attacked by siege weapons, which the current Siege Workshop is lacking. This could also be affected by magic, as you may be able to use spells to knock down city defences, for a few turns for your attack.
Further, if the city is split into multiple tiles, a very neat tactical map could be generated by adding buildings as obstacles instead of trees. Not only would this look cool, it would also bring an interesting tactical twist as the defender could dig in inside an alley where the enemy will be funneled in, limiting their effectiveness.
3. With the split tile system in place, another interesting facet could be introduced. And that is loyalty. Much like cold war Germany, the two halves of the city will be competing for prowess, and happiness. (take the loyalty system from GalCiv2). When the half of the city becomes too unhappy with the occupiers, be it due to oppresiveness, or how terrible the taxes are, there could be a chance of a rebellion, where the garrisoned troops will need to be put down, and thusly losing the corresponding population from within the city.
This system would preferably stay WITHIN the City itself(doesn't affect non-split cities), as I find it very annoying in both Civ, and GalCiv to have random cities revolting.
4. Further, this would allow a meaningful choice upon capturing a city for Enslave, Loot, no Change, Purge. This would also allow espionage missions(can be built into the Magic system) to win the favor of the opposing section of the city, start riots, etc.
The simplest way to implement this system imo, is to simply make a script that split upon creation of an infrastructure outside of the original tile, to create a new "City", whose name goes something like X city Y Wing/Sector. having the ability to rename these could also be fun.
1. Realistically scale up the difficulty to defend your city as it grows bigger. (Bigger cities in real life requires more guards, defenders, etc)
2. Solve the movement/reward issues.
3. Adds more depth to Sieges, and more options
4. Adds more interesting outcomes to wars with shared cities.