A microcontroller is more flexible than a FPGA, but it lacks the ability to parallelize (as many) tasks as an FPGA. Hardware interrupts on a uC are definitely not free and can impact performance from the overhead associated with processing the interrupt, where an FPGA can process any interrupt for "free" without impacting the performance of any parallel module. Real time apps can be implemented on uC's and DSP's, but may not be able to meet them depending on the time constraints on your system.
FPGA's and GPU's were never meant to compete. GPU's will destroy an FPGA on any parallel data processing task, but that data needs to first be populated onto the GPU. A GPU's bottleneck is (usually) never it's processing speed, but it's data population (RAM) bandwidth. A GPU will never have direct access to hardware, where as an FPGA does. The overall speed of a GPU exceeds that of an FPGA for specialized parallel processing, but the latency of a GPU is larger.
The point is that FPGA's are specialized, and so are other co-processors/hardware. They should be used only when it makes sense to use them, and more ad-hoc or flexible solutions are not viable.