Если свойство простое, например неявное свойство:
public int X { get; set; }
или чтение из локальной переменной:
public int X { get { return _x; } }
, то компилятор оптимизирует код так, чтобынет разницы между многократным обращением к свойству и помещением свойства в переменную и доступом к нему.
Я проверил это, сравнив 100 миллионов итераций обращения к свойству десять раз и скопировав свойство в переменную и получив десятьраз, и нет заметной разницы вообще.
Обычно свойства должны быть легковесными, чтобы вам не приходилось ожидать какой-либо тяжелой обработки каждый раз, когда вы получаете к ней доступ.Если получить значение для свойства дорого, класс должен кэшировать его внутренне, чтобы чтение свойства только в первый раз делало дорогостоящую операцию (шаблон ленивой загрузки).
Если получение свойства дорогокаждый раз это должно быть вообще не свойство, а метод получения.