There are various posts on this in the forum, so it would be a bit difficult to find them all.
Basically, the processing that has to happen after a city sync can take a long time. Larger cities / cities with more people running there - those are the biggest trouble. This can slow down overall global syncing, since a single large city can back up the job queue for hours.
On top of that, I used to sync cities through various Overpass servers (a service that allows querying OpenStreetMap data in various ways). Those servers are quite unreliable, which further slowed things down by causing each city sync to be retried several times before running successfully. That part of the issue is resolved now that I use local data.
After I rebuilt the syncing system, I worked on improving processing speed. I botched that effort a bit, by misunderstanding a certain query … This would result in certain cases where activities would be skipped for processing, which resulted in people’s stats going wrong. So, the actual sync is much faster now but I haven’t resolved the processing slowness.
Supporters do get access to a manual sync option (in the three dot menu on the city page), which seems to help people out a bit.