In addition to Macneils points...
Red-black trees are maybe more directly useful because there are useful efficient operations that aren't widely supported in standard library implementations such as the C++
std::map (at least AFAIK). Red-black trees can support "split" (cutting a tree into two, one containing keys less than a specified key, and one containing keys greater) and "join" (the reverse, combining a tree of big keys with a tree of small keys) can both be done in O(log n) time, but if these are supported in standard container libraries, it seems to be a well-hidden thing.
However, "augmenting" data structures is common. A simple example is adding size-of-subtree information to nodes in almost any tree data structure to support O(log n) subscripting. More sophisticated examples include interval trees.
Once you get the idea of augmenting data structures, there's a lot of variations that can be useful for particular applications - and very few are available pre-packaged as a library. Existing standard-library data structures (e.g. such as
std::map) cannot be augmented short of copying the source code and modifying it directly - you can't augment them using template parameters.
Of course to develop an augmented data structure, you need to understand the underlying non-augmented data structure.
AVL trees can be faster than red-black trees if you do a lot more searches than inserts/deletes (and provided you don't need those split/join operations), so depending on the application, they may be a very good base for augmenting.