Извинявай, ама няма как да се мине без критика... Прочети много внимателно за функциите, как се извикват, за стека на извикванията и рекурсията... Връщането във функцията, от която си извикал дадена функция, не става с нейно извикване или с goto, става с изход от извиканата функция. Ти имаш функция А, която вика функция Б, която вика А и т.н. - на това му се вика косвена рекурсия.
mara@OVNI:~$ ./a.out
HELLO
ENTER
Go back to main menu? (y/n)y
HELLO
ENTER
Go back to main menu? (y/n)Go back to main menu? (y/n)y
HELLO
ENTER
Go back to main menu? (y/n)Go back to main menu? (y/n)y
HELLO
ENTER
Go back to main menu? (y/n)Go back to main menu? (y/n)n
Exitting..
Go back to main menu? (y/n)Go back to main menu? (y/n)n
Exitting..
Go back to main menu? (y/n)Go back to main menu? (y/n)n
Exitting..
Go back to main menu? (y/n)Go back to main menu? (y/n)n
Exitting..
mara@OVNI:~$
Ето ти още един резултат от изпълнението с два пъти "y". Като прочетеш за извикванията на функции и си начертаеш схема на това, което правиш, сам ще си обясниш това, което се получава.
И не забравяй, че програмите винаги работят правилно, просто програмистите им казват да правят грешни неща
ПС. Коя е тая книга, дето четеш от нея? Гледам 2рата функция ти е тип int и завършва с return 0, новите C стандарти не изискват такова нещо, има си тип void за функция..