When I want to delay something I almost always use [Coroutines](https://docs.unity3d.com/ScriptReference/Coroutine.html). You can specify the time for delay, and since they are asynchronous, so each object can have its own timer running - independent of each other.
Also you can [start](https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html) Coroutines and [stop](https://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html) them.

Over the time I found that often even more convenient (less code) is [InvokeReapeating](https://docs.unity3d.com/ScriptReference/MonoBehaviour.InvokeRepeating.html) or just [Invoke](https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html) - you specify time when to fire a function, and that's it. And again each object can have its own timer.

Update() timers gets messy, especially if a lot is happening inside Update() function.

P.S. I do not normally use Update(). In most cases of delays, waypoints, cooldowns, respawns, etc.- *Coroutines* or *InvokeRepeating* or *Invoke* do the job brilliantly, without affecting the rest of the code.

P.P.S I usually suggest people to ditch Update() all together - *Update* works, but quickly gets messy..