Why we need to use different "VARIANT result" variables?
You don't have to, it is just the way the sample was written. Do be careful when you re-use VARIANT variables, just calling VariantInit() or assigning result.vt = VT_EMPTY is dangerous. A variant can store resources that need to be released. As was done in the snippet, note the call to VariantClear(), required to release the BSTR. Which is different from VariantInit(), VariantClear releases the resources first before initializing the variant again.
Also note how it was omitted after the DISPATCH_PROPERTYGET call. That's okay but you have to know what you are doing. Okay in this case because a VARIANT can store a floating point value without having to allocate memory for it. Calling VariantClear() anyway is certainly not wrong.
And keep in mind that MSDN source code is often written to compile with a C compiler. If you write COM code then you'd almost always favor using C++. Which can certainly to a better job, you can now use the _variant_t class. A wrapper class that avoids silly mistakes and makes the syntax cleaner as well, what you asked for. You no longer have to use VariantInit or VariantClear, the wrapper does it for you and never gets it wrong.