Making Quaternion.RotateTowards finish at exact time Vector3.MoveTowards finishes in a coroutine?

I have absolutely no idea if this makes sense, but I have a coroutine in which the transform.position, transform.rotation, and transform.localScale are all being moved towards and rotated towards their own specific value until the position of the object reaches it’s value. What I am asking is how to make everything finish at the exact time the transform.position reaches it’s value/position. Here is my current code to make it slightly clearer:

private IEnumerator IMoveTransform(Vector3 position, Quaternion rotation, Vector3 scale, float speed)
    {
        while (transform.localPosition != position)
        {
            transform.localPosition = Vector3.MoveTowards(transform.localPosition, position, speed * Time.deltaTime);
            transform.localScale = Vector3.MoveTowards(transform.localScale, scale, speed * Time.deltaTime);
            transform.localRotation = Quaternion.RotateTowards(transform.localRotation, rotation, speed * Time.deltaTime);

            yield return new WaitForEndOfFrame();
        }

        transform.localPosition = position;
        transform.localRotation = rotation;
        transform.localScale = scale;
    }

Have you tried interpolating them? Untested code below:

private IEnumerator IMoveTransform(Vector3 position, Quaternion rotation, Vector3 scale, float speed)
{
    // Keep track of how far we've travelled along this path.
    float progress = 0;
    float distance = (transform.localPosition - position).magnitude;

    // Keep our original position
    Vector3 originalPosition = transform.localPosition;
    Vector3 originalScale = transform.localScale;
    Quaternion originalRotation = transform.localRotation;

    // Default transition time is 1
    while (progress < distance)
    {
        float t = progress / distance;

        transform.localPosition = Vector3.Lerp(originalPosition, position, t);
        transform.localScale = Vector3.Lerp(originalScale, scale, t);
        transform.localRotation = Quaternion.Lerp(originalRotation, rotation, t);

        progress += speed * Time.deltaTime;

        yield return new WaitForEndOfFrame();
    }
    transform.localPosition = position;
    transform.localRotation = rotation;
    transform.localScale = scale;
}

This is a naive way of doing it just to demonstrate Lerp. This will not allow any other movement while the routine is running, so you’ll want to modify it accordingly if you want this to be gently pushing your object into a desired form alongside other influences.