>My best bet is to check all triangles' vertices, figure out which make matching edges
If static texturing is an option and you don't need the “worn out” look to be dynamically changeable in-game, then offloading this to the texture art phase would be a better option.
If you need dynamic wearing-out as a feature then your approach seems okay.
You could figure out offline which faces have edges with 'wear-out potential', and pre-bake such data, rather than trying to figure that out during runtime.
Instead of using the vertex / fragment shader with a color parameter and barycentric coordinates, another (unconventional) option might be to use megatexturing, and to update the virtual coordinates for those faces that need to be displayed as worn out. But that's probably only an option if you have megatexturing already set up, otherwise it might be too much of a round-about way to reach your goal.
Another perhaps more readily achievable way might be to render-to-texture, updating your texture at those places where it needs updating to have the worn visual look. This would involve again, book-keeping which faces need to be considered, and then copying texture data for those faces from a source texture (which should be a representation of the worn out surface) to the displayable texture.