- very limited color palette, typically 256 colors with ugly dithering (yes, you can have more than 256 colors in animated GIF, but this is uncommon)
- GPUs don't support GIF compression in hardware (means you will have to unpack them on CPU anyway)
- you only get to pick ONE color for transparency (unless implementing custom processing)
- no random access. All preceding GIF frames need to be read and decompressed to access a frame.
- being compressed. You need dedicated decompression function in code. You can't choose different (better) compression algorithms. (yes, uncompressed GIFs exist too, but this is uncommon)
With custom format all these items get resolved very quickly. You have much more control over image format, quality, transparency, random access and compression (including GPU-supported formats alike DXT). Even better, you can prioritize features you need.
One advantage Gifs have over Animation Sheets is that you don't have to think about frames going too fast or too slow because of your code and updating in proper ticks.
Above statement is misleading. Syncing GIF fps with actual game fps is not much different than syncing custom sprites animation. In both cases you have exactly the same setup - a list of frames, desired framerate and render events. There is no magic powder in GIF - you will have to decompress GIF into spritesheet anyway, which defeats the purpose.
Of course some game engines may hide some of GIF issues behind the curtains, but then, same can be done with spritesheets in a better way.
Said that, there are some few cases where GIFs could kind of work. E.g. HTML/CSS GUIs, but these are quite rare and resource-hungry by themselves.