For almost any language that is complex and powerful enough to be interesting, different people will have different views on the best way to use this language.
You ask: "Should the complex type really be avoided?" As you saw in the document, you point to Kohsuke Kawaguchi (who was a member of the working group that designed the XSD and wrote several important XSD tools, including one of the first XSD validators) advises users to avoid certain constructs in XSD, including complexType, often on on the grounds that the ratio of their advantages to their disadvantages (in particular, their complexity) is small. You can (and really, you must) make up your own mind regarding the persuasiveness of KK's arguments.
Since (as far as I see) your question is to ask: βIs KK right?β, I understand that you do not feel completely comfortable composing your own mind, or at least you are curious and want to know what others think.
In general, it is safe to say that many XSD users and many creators of XSD tools do not agree with KK. They find the ability to extract complex types from other complex types useful, and they use it.
It is equally safe to say that many others agree with KK that a particular XSD design is too complex and should be avoided. Some who feel this way write documents describing "best practices" that outline the structures to use and build to avoid; sometimes the contents of such documents are useful, and sometimes not. Many who most strongly agree with KK on complex XSD types do not use XSD at all when they can avoid it: they prefer Relax NG (or in some cases DTD or Schematron).
In other words: the opinions of qualified observers are changing, as are the opinions of unskilled observers. I know some very smart people who disagree with KK on this. And I also know that KK itself and some of those who agree with it are also very smart. I'm not going to choose a side here.
Finally, you ask, if this is problematic, why does it exist in the language construct in the first place? Any construct in any language exists, because those who developed the language thought it was worth it. In the case of XSD and complex types, this means: complex types are in the XSD as named objects, because essentially everyone in the responsible workgroup wanted them in that language. This does not prevent them from being problematic: like everyone else, people with great technical skills can make mistakes, and groups that need to seek consensus can, under suitable circumstances, create projects that no one really likes (but everyone prefers an alternative without such design, sometimes compromise is the only way to achieve something).
Hope this helps.