The code is blocking, simply spending too much time waiting for events like pings, GPS characters on input, and especially delaying.
Get rid of the delays. ALL OF THEM. The computer can do nothing while delaying. Study the Blink Without Delay example that comes with the Arduino software to see how to use millis() instead, and for more complicated projects study this tutorial.
The program is quite complicated and the entire approach needs to be changed.
Google "non blocking pulsein()" for lots of discussion on pulsein options. Good luck!