What we figured out is that PlayCanvas samples the animation every 0.1 seconds. That is not nearly frequently enough for a typical 30 fps animation. It is enough for a 5fps animation. So if your original animation is 30 fps, you need to scale out the keyframes so that they are six times as far apart if you want to guarantee an accurate conversion. You then play it back at 6x speed in PlayCanvas. This doesn’t appear to be a bug so much as it is a limitation of the conversion process. Sampling every 0.1 seconds is simply too crude for 30 fps animations where keyframes can occur at 0.033333 second intervals.
If your animation is long and/or complex, this may make for fairly large animation files. Depending on your animation, you might want to try animating at a slower frame rate like 15 fps and then multiplying the keyframe spacing by 3x.