First of all there are cases where redo doesn't make any sense (render, save, open), in those cases simply running the operator again is fine.
Operators have their own internal data which is used to execute an action, in most cases this is sufficient to store all information needed to redo an action (make use of the F6 popup, or be called from a Python script).
But consider the knife tool for example, can have the view manipulated as its accessed, so the tool would need to store the viewport orientation of every line added.
While this is possible of course (in principle), the benefit of adding this is limited since these tools are intended to be accessed interactively.
Another example is the rip tool, which will give different results based on where you're cursor is in relation to the selected vertices. Its also possible to simple store the mouse location and re-use that, but its unlikely to be very useful.
There are cases such as bend transform which could be made to redo, but depend on the view orientation, 3d cursor to define a line to the mouse and the distance the mouse moves once the tool is activated. Manipulating these values only-via buttons is possible but would end up being an nonintuitive matrix of buttons. Such settings would be better manipulated via an adjustable on-screen widget however blender currently doesn't have such facilities.