When you call SPList.Items.Add() it will fetch all list items through an SPQuery. This can be very costly when you have a considerable amount of items.
public SPListItemCollection Items
[ClientCallableExceptionConstraint(FixedId = "c", ErrorType = typeof(SPQueryThrottledException), Condition = "There is a throttle failure.", ErrorCode = -2147024860)]
return this.GetItems(new SPQuery
ViewAttributes = "Scope=\"Recursive\""
When you call SPList.AddItem() it avoids fetching all items. You'll see in the implementation (code below) that it does a 'trivial' query which basically says "get me all items where ID = -1".
public SPListItem AddItem()
SPQuery query = this.HasExternalDataSource ? SPQuery.TrivialQueryExternalList : SPQuery.TrivialQuery;
SPListItemCollection items = this.GetItems(query);
When you're adding an item it makes no sense to first fetch all existing items in the list. The old implementation is preserved for backward compatibility.