User applications, not the common language runtime, throw custom exceptions derived from the ApplicationException class. The ApplicationException class differentiates between exceptions defined by applications versus exceptions defined by the system.
Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.(Inherited from Exception.) Remarks ArgumentException is thrown when a method is invoked and at least one of the passed arguments does not meet the parameter specification of the called method.
In a nutshell, System.Exception is defined by applications and System.SystemException is defined by the system (.NET Framework).
InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments. Typically, it is thrown when the state of an object cannot support the method call. For example, an InvalidOperationException exception is thrown by methods such as: IEnumerator.
As you point out, in the article Creating and Throwing Exceptions (C# Programmming Guide) under the topic Things to Avoid When Throwing Exceptions, Microsoft does indeed list System.IndexOutOfRangeException as an exception type that should not be thrown intentionally from your own source code.
Describes that a "System.OutOfMemoryException" exception may occur when you use SQL Server Reporting Services to build a report. Provides several methods to resolve this issue.
StackOverflowException. This usually means that you have a recursive call in your code. A recursion is simply a method that calls itself, causing the stack to overflow and throw the StackoverFlow exception.