I found one of the big wrenches that was mucking up things for me. I'm drawing and redrawing tracks at runtime, and I use Spline.Clear() to clear out the old control points before spawning new one. But I also had Use Pooling checked true for the spline, which is the default. So it seems like when the control points are pulled from the pool, their rotations are not being reset. That's how I could draw and redraw the same track and get different orientation results.
I unchecked Use Pooling, and now I'm working with shiny new control points.
I unchecked Use Pooling, and now I'm working with shiny new control points.