Вам не нужно вручную пересекать граф, потому что новые версии beanutils commons также поддерживают выражения типа bean1.prop1.prop2.
Что касается производительности, если вы выполняете только один раз каждое выражение, то реализации propertyutils хороши, потому что некоторая степень отражения абсолютно необходима.
Вы можете улучшить производительность, если каждое выражение вызывается несколько раз. Затем кэширование финальных методов для выполнения может улучшить результат, потому что вы делаете большое отражение только один раз для выражения.
Если вы используете выражение несколько раз, вы можете взглянуть на OGNL, который поддерживает "скомпилированные выражения".