A proper function will always return the same value if you give it the same input, so there's no need for the computer to always re-run the expensive computation.
Right. Without state using only pure functions, you get to ignore change and time, therefore even the notion of "reactive programming" is not very meaningful.
That functions are pure means that their inputs and outputs are well defined, not that they ignore or don't work with things like state or time.
Before monads were 'invented' for functional programming, reactive programming (or stream based I/O) was the only way of handling state and side effects in Haskell.