Here is another solution which should reproduce the default behavior exactly. It works by selecting under EvaluationCell[] a continuous sequence of cells each having both CellAutoOverwrite -> True and GeneratedCell -> True options (the system considers such cells as pre-existing output which should be replaced by new output). Then it deletes them.
This solution also utilizes an interesting observation that even if we manually set options CellAutoOverwrite -> True and GeneratedCell -> True for a cell with style "Input", the latter won't be overwritten by any output generated by previous input cell. Moreover, upon usual editing of the contents of this cell, these options will be removed. In this implementation this observation is used for limiting the set of cells which will be checked for these options: they can be located only between EvaluationCell[] and NextCell[CellStyle -> "Input"] (if the latter exists).
The StyleDefinitions given in the question are set temporarily for the time of evaluation of the contents of the cell, and then are reset to the defaults by CellEpilog. It is necessary because if they are changed in the CellProlog, the change has no effect during evaluation of the code of CellProlog, unfortunately.
SetOptions[EvaluationNotebook[], {CellProlog :> AbortProtect[ Module[{nb = EvaluationNotebook[], evalCell = EvaluationCell[], cells, pos, cellsBelow, nextInput, len}, If[And[CurrentValue[#, GeneratedCell], CurrentValue[#, CellAutoOverwrite]] &@ NextCell[], cells = Cells[nb]; pos = Position[cells, evalCell]; If[Head[nextInput = NextCell[CellStyle -> "Input"]] === CellObject, cellsBelow = cells[[pos[[1, 1]] + 1 ;;]];;; Position[cells, nextInput][[1, 1]] - 1]], cellsBelow = cells[[pos[[1, 1]] + 1 ;;]]]; len = Total@Split[ Boole@Thread[ And[CurrentValue[cellsBelow, GeneratedCell], CurrentValue[cellsBelow, CellAutoOverwrite]]]][[1]]; NotebookDelete[cellsBelow[[1 ;; len]]] len]]]]; ]; SetOptions[nb, StyleDefinitions -> Notebook[{Cell[StyleData[StyleDefinitions -> "Default.nb"]], Cell[StyleData[All], CellAutoOverwrite -> False, GeneratedCell -> False]}]]]], CellEpilog :> SetOptions[EvaluationNotebook[], StyleDefinitions -> "Default.nb"]}] The disadvantage is that it ratheris relatively slow, especially for large Notebooks.
P.S. The whole approach has an issue: by the time the contents of the cell starts executing, the output will already be deleted, and therefore, for example, NextCell[] will return a different value than by default.