Right now accelerated animations share a start time for a given transaction, and software animations share a start time for a given rendering update, but there's no guarantee that those shared start times are the same for accelerated and software animations started as a result of the same rendering update.
<rdar://problem/70526060>
One way to fix this would be to use the time used by accelerated animations as obtained through GraphicsLayerCA::platformCALayerAnimationStarted() and feed that back to the software animations.
We should also consider not using the animation begin time to bake the time offset in, and instead use nested animations with groups to use the timeOffset property of the CA animation. This way we won't need to hard set a beginTime for animations with an offset in GraphicsLayerCA::updateAnimations().