How to Update a GameObject coordinates to folow in realtime and don't lose performens or crushing Unity.[SOLVED]

I have a small issue and jus out of ideas how to do it, I want to update a GameObject Vector3 in realtime but if I use simple Update method fps drops low and it’s understandable.

Ther is a many objects whit tag enemy in the scene and I want to make a main object to folow the closest and change the object to dolow if another “enemy” object became closer.

I also tryed to use System.Threading but it did’t give me ane result fps lowers the same way.

Here is small excample of what I’am trying to achive:

    Vector3 target;

    private void Start()
    {
        StartCoroutine(UpdatePath());
    }

    private IEnumerator UpdatePath()
    {
        target = GameObject.FindGameObjectWithTag("Enemy").transform.position;
        StartCoroutine(FolowPath());
        yield return null;
    }

    private IEnumerator FolowPath()
    {
        while (true)
        {
            Vector3.MoveTowards(transform.position, target, 20 * Time.deltaTime);
            StartCoroutine(UpdatePath());
            yield return null;
        }
    }

Oh god,

UpdatePath starts FollowPath1,

FollowPath1 starts UpdatePath wich launches FolowPath2,

FollowPath1 continues its while loop, starts FollowPath3,

FollowPath2 launche UpdatePath, which launches FollowPath4,

Follow Path3 launches UpdatePath which launches FollowPath5,

Follow path5 launches UpdatePath which launches FollowPath6, etc

Soon you explode with an insane amount of FollowPaths calling their operations from never ending while loops, evolving in a geometric progression.

Do this instead:

private void Start()
     {
         StartCoroutine(UpdateAndFollowPath());
     }
 
     private IEnumerator UpdateAndFollowPath()
     {
         while (true)
         {
             //move this like into here:
             target = GameObject.FindGameObjectWithTag("Enemy").transform.position;
             Vector3.MoveTowards(transform.position, target, 20 * Time.deltaTime);
             //UpdatePath());  remove this
             yield return null;
         }
     }