Acquiring and fusing data from different controllers
The typical way to do this with a single micro is to establish buffers in and stuff them up with ISRs (interrupt service routines) triggered by the reception of serial GPS data or I2C data. Set a flag when an entire message is available in the buffer and read it with your background routine. At 4800 baud you've got a leisurely 2000 microseconds or so between characters so even if the hardware buffer is a single character you have lots of time to do other things. If you double buffer you only have to worry about the inter-message time rather than the inter-character time.  

The AVRs have decent interrupt handling and you can probably write everything in C if you want.