Normally water is simulated by creating many particles and having them interact with each other and their environment. Then water is rendered based on particle density in different regions. This is an expensive operation.
Another simulation is less costly but looks less realistic. A 2D grid of values holds particles, these particles only move around the grid and don't have as complicated interaction between each other. Rendering is done the same way. This is less costly but less realistic.
Both of these solutions are pretty complicated to implement and are what I'd consider to be costly operations.
I know you didn't want costly solutions, but maybe the costly approaches will give you some ideas for how to implement a less costly solution.