What sort of circumstances typically warrant the use of an interrupt?
When the action to be reacted to could happen at any time and needs to be noticed without delay or could itself be so transient as to possibly be missed otherwise.
An example in my case is reading the input from encoders on robot wheels to count the number of turns of the wheel. These inputs are used to ensure that each wheel is running at the same speed by adjusting one or both if a mismatch is detected. Meanwhile the robot is scanning for obstructions by rotating a servo, flashing LEDs to indicate its current state etc.
The encoder signal could arrive at any time and is by its nature is transient so could be missed. Instead the ISR flags receipt of the input, increases a counter and exits. The value of the counters is compared next time through loop(), during which time it is possible that they have been incremented several times, and the wheel speed(s) are adjusted.
If the encoders were polled in loop() then they could be in one of 2 states but the ISR ensures that the number of state transitions are counted correctly.