I have continued dwelling into the synchronization speeds trying to improve the performance. One big part is the time it takes to load the contracts from 1 year back after a reorganize. If we instead keep a stack of the known contracts and pop them on reorg we can greatly reduce the impact.
The bottom, purple line contains this change and it is not nearly as affected by the reorgs starting at 900k. Total import time for that particular data set is now under an hour.
Most of these changes haven't been merged yet and some might not even be doable in production, but at least we have a good understanding of the synchronization bottlenecks.
Oh, and this affects regular network synchronization as well, not just block import. I just happen to have a good data set with both good and bad sections so it's suited for import tests. I think with all these changes we should be able to sync the entire chain over the network in around 2 hours or less.