<opinion>
Superficially, Yes.
More accurately, I’d put them in the category of “Limited and specific use”.
Yes, they’re useful. But, they shouldn’t be used as a general solution to a wide variety of situations. There are some very specific and targeted cases where they are the right answer. However, they’re frequently considered for use in situations where other solutions would be more appropriate.
</opinion>
For more details on this perspective, see the blog post at Avoid Django's GenericForeignKey - lukeplant.me.uk
I didn’t write it, but it says everything I would about the subject, plus some.
Regarding the alternives, there’s no “pat answer” for that. Deciding what solution should be used can only be made with a full understading of the complete system being modeled. It may even turn out that in your particular case, generic relations are the right answer.