Well, let's run through the logic.
ngui.start():
1. New object gets created. Where is it created? It must be added to your UI root somewhere. Assuming you changed Instantiate to NGUITools.AddChild(parent, child) this will be resolved.
2. You search for a game object using its tag. What has this tag? I'm going to assume it's some object in the prefab you instantiated.
3. You get the tween on that object from #2 and add an OnFinished listener to it.
4. I'm assuming the tween is not disabled on your prefab, so it will start playing now.
5. The tween gets to the end, Fin() gets called. You are now calling close(), which destroys the game object.
6. You now start a new class, and everything begins again from #1.
Here's one problem. When you call Destroy(gameObject), the object does not get destroyed right away. The second time your function runs, your GameObject.FindWithTag is likely going to find the first instance, not the second one. This is one of many reasons why GameObject.Find is a terrible practice. You instantiated an object. Shouldn't you at the very least search for a child of that instance, not globally?
Second problem... you keep instantiating and deleting objects over and over. Why not re-use the same one? You could simply set the tween to loop. Why not do that? Why create a brand-new menu every time the old one finishes tweening?
Another issue... why do you rely on the order in which tweens will appear in the list returned by GetComponents<UIPlayTween>? Why do you assume that the tween you want is always going to be the first one?