Properties should strive to be side effect free.
IF the side effect is invisible to consumers of the class (a lazy creation of a string which then doesn't change) then this is much less of an issue.
By default debuggers tend to display (thus evaluate) properties. If they have side effects this can cause considerable grief.
Throwing from a setter if the supplied value is illegal is generally okay. Throwing from a getter is generally considered poor.
These are, as ever, rules of thumb and circumstances can dictate that they are not followed. A good example is the properties on the types generated via Linq to SQL. If you have lazy lookup of child properties then evaluating it does indeed trigger a database read. This is offset but the ease of use, readability and consistency of the resulting objects - it's one of those balancing competing rules things.
Be wary of rules that say MUST or NEVER. Sometimes rules of this nature exist, and are reasonable, but they are actually uncommon.