I understand what you want to do. You need a different approach, however.
Let's talk about "main" first. The actual main() function of an arduino sketch is in the arduino core library. It sets up the arduino board, calls your setup() function and then calls your loop() function over and over again, forever. To really re-do main() would be the equivalent of a reset. Changing the PC or stack to jump there is not a good idea. Things will get left on the stack, globals and static variables will not get initialized, and memory will have junk in it.
You can try to do a hardware reset (there are threads in the forum on this) but it is slow and could leave any devices attached to the arduino in an unknown or dangerous state.
What you really need to do is carefully structure your loop() function so that it puts your robot into a known good inactive state when an flag (set by the interrupt function) is in the right state.
#define NO_INTERRUPT 0
#define INTERRUPTED 1
#define INTERRUPT_ENDED 2
volatile int flag;
while (flag == INTERRUPTED)
if (flag == INTERRUPT_ENDED)
rest of loop function
Where reinitialize() will stop whatever the sketch is doing, put any attached hardware into a good state (turn off motors and sensors, etc), reset all global variables to their initial values, and make sure the arduino is ready to run the rest of loop() again (fix timers and stuff).
This is really the only safe way to do what you want. It may involve re-writing some of your sketch. You may have to add additional code to check for the interrupt flag if any of the code in loop() takes a long time, or has loops in it.
Hope this helps,