My main complaint is that they problem they tried to solve – “seamless” exchange between very different apps – is extremely hard. Different packages have such different affordances that even with all of the complexity they layer on to handle, say, the difference between Max animation controllers and Maya animation channels you can’t really rely on the results. Viewed as a way to, say, round trip data between Maya -> Max -> Maya again FBX is pretty bad, you can’t even rely on something like a custom numeric attribute going and coming back with the same name. But the exported data is full of extra information intended to support that project, which you have to either ignore or wade through when trying to debug a file or to interpret one.
If you simply said “hey – it’s triangle meshes, vertex animations, material assignments, and bones-over-time – but it works reliably and fast and the same data always encodes the same way!” I’d be a lot happier. Export is a great chance to normalize data, so that people downstream of the export don’t know or care about how the data was made, only what it says. In FBX getting to that point is not trivial.
It’s true that the problem is not super easy – the biggest issue is convention driven stuff like handedness flips. But its not an insoluble problem as long as you say “the point of exporting is to get data that’s unambiguously like so”. When you add in all the degrees of freedom added by deformers, animation controllers, constraints, material models, rigs… it goes from soluble-but-hard to what we have: never reliable enough to forget about.