Hi Kevin,
I tested the behavior of functions USplineComponent::Get*AtDistanceAlongSpline(), and they all seemed to return reasonable values. I have attached a tiny test project to this reply containing a spline tester blueprint which allows you to observe the behavior visually: just enter PIE, and a sphere with axes and tangent representations will follow along a spline with constant world-space speed. You can also migrate that blueprint to your project if you find it helpful.
Now, in the snippet you provided, some things called my attention:
A) You did not include how GrindData.CurrentGrindTangent is calculated, but note that methods USplineComponent::GetTangent*() return the tangent vectors used to define the spline, which can vary greatly in length depending on the local spline curvature and the distance between its control points. To get the direction along the spline at a given point, prefer USplineComponent::GetDirection*()
B) The calculation of SpeedAlongTangent projects a velocity onto the spline. Besides being affected by the length of GrindData.CurrentGrindTangent, note that this will also have the effect of killing any velocity component that is not aligned with that tangent vector (instead of turning the velocity to force following the tangent vector with unaltered scalar speed). Depending on the other calculations performed, this might dampen the resulting speed where the spline has greater curvature.
C) If you have very long spline segments between pairs of control points, try increasing the value of ReparamStepsPerSegment on the spline component to see if it improves the behavior.
Please let me know if this is helpful or if you still need further assistance.
Best regards,
Vitor