Because maintainability and readability of applications is important, it may be worth considering more general techniques like ray tracing and Metropolis light transport for providing reflections and shadows. As multiprocessor machines slowly become more prevalent, it may be the case that a simple brute-force algorithm provides acceptable performance without the complexity of the combination of the above techniques.
For example, an application implementing the algorithms above for curved reflectors and blurred reflections including view-frustum culling and reducing the size of textures used approaches a prohibitive complexity level. For small reflectors, ray tracing can achieve interactive performance with much less algorithmic complexity.
Unfortunately, there is no right answer and each development team or developer must evaluate their tolerance for complexity, frame rate, and quality.