Respawning without creating Clones

I have been trying for a while to get the player to respawn without the player having to restart the game. However, no matter what variation I try, I cannot seem to get 1 player to be in the game. Currently, it creates a loop making tons of players. How could I fix my current script or redesign it to make it do what it is designed to?

The variable play is set to a prefab of the player
Also, bonus points if you can find out how to fix my regen script to regenerate 10 health every 5 seconds.

using UnityEngine;
using System.Collections;
public class Health : MonoBehaviour {
	public float MaxHealth=100;
	public float CurrentHealth;
	public bool Invincible;
	public bool Dead;
	
	public bool run = false;
	public bool regen = true;
	public Transform play;
	public Transform fplay;
	
	// Use this for initialization
	void Awake () {
		//MAKE THE CURRENT HEALTH THE MAX HEALTH AT START
	CurrentHealth=MaxHealth;
	}
	
	//regen doesnt work yet
	IEnumerator Start() {
		if(regen=true && CurrentHealth>0){
 			yield return new WaitForSeconds(5);
 	 			run = true;
				yield return 0;
				run = false;
			}
		}
	
	// Update is called once per frame
	void Update () {
	
		//IF INVINCIBLE, HE CANNOT DIE..
		if(Invincible){
		CurrentHealth=MaxHealth;	
		}
		else{
		if(CurrentHealth<=0){
			CurrentHealth=0;
			Dead=true;
		}	
			
		//MAX HEALTH
			if(CurrentHealth>=MaxHealth)CurrentHealth=MaxHealth;
			
			if(run){
				CurrentHealth=(CurrentHealth+=10);
				}
			//WHEN DEATH IS UPON HIM
		if(Dead){
				CurrentHealth=MaxHealth;
				var cplay = GameObject.Find ("Player");
				var obj = GameObject.Find ("Respawn");
        		Instantiate(play, obj.transform.position, Quaternion.identity);
				Dead=false;
				Destroy (gameObject);
			}
		}
	}
}

Instead of creating a new player and destroying the old one, why not just reuse the current gameobject of the player?
So in the script instead of this:

          CurrentHealth=MaxHealth;
          var cplay = GameObject.Find ("Player");
          var obj = GameObject.Find ("Respawn");
               Instantiate(play, obj.transform.position, Quaternion.identity);
          Dead=false;
          Destroy (gameObject);

do something like this:

          CurrentHealth=MaxHealth;
          var obj = GameObject.Find ("Respawn");
          transform.position = obj.position;
          Dead=false;

Also the reason why you are getting an infinite amount of players spawing is because

var cplay = GameObject.Find ("Player");

is finding the current player object and not the prefab, if you wish to use the prefab then you need to assign it in the inspector.

for the regen do something like this:

void Regen()
{
    if(CurrentHealth + 10 < MaxHealth)
    {
       CurrentHealth += 10;
    }else if(CurrentHealth < MaxHealth){
       CurrentHealth = MaxHealth;
    }
}

void Start()
{
    InvokeRepeating("Regen", 5, 5); //Will call the method every 5 seconds
}

Umm… really REALLY stupid question:
Why not just move the player to the spawn position instead of destroying and recreating game objects?
Just reset his Vector3 and all the other variables you want to reset. That’s what I’d do.