From what I see your do have a bad overal code structure. No offense but I think you should do a compleete rewrite of the code. Yes I know that it would be a lot of work, but in the end you will benefit from much nicer structure wich will alow you to track bugs more easily and even lower the chances of new bugs hapenning, add new fetures, etc.
I would recomend to use overal code structure similar to somethink like this (writen from head):
1. Game initialization
1.1. Initialize graphic engine
1.2. Initialize sound engine
1.3. Initialize input conrols
1.4. Load most necessary graphics (the ones requred for main menu)
1.5. Load most necessary sounds
1.6. Set the game state to gsMainMenu
2. Check the current gamestate
2.1. If gamasteate is gsMainMenu then do te code for main menu
2.1.1. Set input controls for main menu
2.1.2. Render the main menu
2.1.2. Make sure only main menu music is playing
Here I asume your sond engine alows you to have mupltiple chanels for playing of multiple streams
2.1.2.1. If some other music is playing except Main Menu music make transition by lowering lowering volume of those chanels, start playing main menu but do so with low volume. Then avery cycle repeat process except that this time jou just lower the volume of other chanels and raise volume of MainMenu music chanel. When the volume of other chanels reaches zero you stop their plaback.
The amount of decreasing and increasing volume should be calculated based on volume settings so that the transition is done in certain amount of cylces.
2.1.3. Check wich menu item is presed
2.1.3.1. If new game is presed then check if there is already an active game
2.1.3.1.1. If there is already an active game notify the user that by starting the new game he will lose all the progres off a current game
2.1.3.1.1.1. If user confirms set gamestate to gsNewGame
2.1.3.1.1.2. If user does not confirm return to main menu
2.1.3.1.2. If there isnt an active game already set gamestate to gsNewGame
2.1.3.2. If Resume game is presed change gamestate to gsGame
2.1.3.3. If Options is presed change gamestate to gsOptions
2.1.3.4. If Exit game is presed check if there is already an active game
2.1.3.4.1. If there is an active game notiffy player that by exiting the game he will lose all the progres
2.1.3.4.1.1. If the player confirms then set gamestate to gsExit
2.1.3.4.1.2. Else return to main menu
2.2. If gamestate is gsNew game do new game initialization
2.2.1. Check if there is an active game already
2.2.1.1. If it is clear the resources of the current game
2.2.1.2. Else initialize the new game
2.2.1.2.1. Load necessary resources
2.2.1.2.2. Load level
2.2.1.2.3. set gamestate to gsGame
2.3. If gamestate is gsGame then
2.3.1. Check if inoly ingame music is playing
2.3.1.1. If not make transition similar than win main menu code
2.3.1.2. Else continue wit oher code related to gameplay
2.3.2. Set input controls to ingame controls
2.3.3. Do teh game related procesing
2.3.4. If game is over set gamestate to gsEndGame
2.3.5. Render game
2.4. If gamestate is gsEndGame clear ingame resources
2.5. If gamestate is gsOption do stuf necessary for option menu
2.6. If gamestate is gsExit start finilizing input, soung engine, graphic engine and finally close application.
While this can look quite scarry at first it actualy isn't so cary. Especialy when you se that by having this kind of structure for your game would alow much more understanding code and also prevent bugs to ocur in any other parts of your code except the one you have been changing. The only ecpetion to this is if you change some code related to graphic engine, sound engine, etc.