Behind the scenes, the effective $payment->getOrder() method (after checking if it is already loaded):
return Mage::getModel('sales/order')->load($this->getOrderId()); // $this in this context is $payment
Thus, data loading is still necessary to retrieve the corresponding data from the database, the getOrder() method is just a convenience. The load() method itself returns an instance of the class, so you can assign it to $product in the first example. The getOrder() and getCustomer() methods are not returned, they return another object, therefore $payment not assigned to $customer in the second example.
The Mage::getModel() method is only responsible for determining the correct class and creating an empty instance of it. Instead of loading, you could instead set the data by calling setData() , passing in an array with the key. All setters return their object, as load() does.
source share