I went through the code and best as I can tell the following is what is causing your performance issues:
1. You create every sprite needed for every screen in the game but you do not seem to turn any of them invisible and instead rely on sprite depth to make the current active screen appear on top of everything else.
2. Some functions such as DisplayPlayingScreen( ) are creating new sprites every time it is called.
Based on what I saw I recommend...
1. Set all sprites not used for the current screen to be invisible. Set all sprites initially visible on a given screen to be visible when that screen first displays. This should greatly reduce the number of total sprites that are visible but hidden and not even needed to be visible.
2. Move the code that is creating sprites out of your functions such as DisplayPlayingScreen( ) into your Visuals.agc module so these sprites are also created only one time.
I could have missed something and maybe you actually are turning all of the unneeded sprites invisible but I did not find the SetSpriteVisible api method anywhere in the code. There is a lot of code to dig through but that is the gist of what I got from the time I spent looking at it.
TI/994a (BASIC) -> C64 (BASIC/PASCAL/ASM/Others) -> Amiga (AMOS/BLITZ/ASM/C/Gamesmith) -> DOS (C/C++/Allegro) -> Windows (C++/C#/Monkey X/GL Basic/Unity/Others)