If I'm looking up the Flametongue's abilities I want them all right there together, rather than to also then have to look up the specific creature that's getting hit with one to see if it's vulnerable or not. Put another way, even with your idea of 'vulnerable to fire' (which in itself is fine) I want as many of the exceptions as possible called out in the Flametongue write-up so I only have to look in one place.And I LOVE keywords for exactly the reason you dislike them! They provide an instant language, an idiom in which the mechanics of the game can speak.
Here's a very simple example. In the 1e DMG there is an item, Flametongue, a sword which burns. It gains a significant bonus against ... (LONG list of specific creatures) plus several general categories of creature. This list was of course obsolete, probably as soon as the game was published. It would have been vastly better to just have had a "vulnerable to fire" trait connected to a fire damage keyword. This is future-proof and it is abundantly clear what you mean. You can STILL have exceptions to this general rule, either by simply not specifying that THIS creature is vulnerable to fire, or by calling out the specific exception in its description.
And while future-proofing things is always a laudable goal, unfortunately there's no real way to do it here without strait-jacketing the design; and strait-jacketed design is exactly what I want to avoid.