I may be missing something here, but I really don't understand what problem/ scenarios the substitution group feature is trying to solve. 

I am unclear why Substitution groups are even needed. If an element Foo is the same type or a derived type of an element Bar, it seems like that I should be able to freely substitute all I want without needing to statically declare the set.