Timeouts worked great for us; the trick we found was just to be deterministic about them. We gave our kids a countdown warning and then invariably applied the same consequences when the countdown expired. After a couple applications of a 3-2-1 countdown followed by a timeout, our kids reliably responded by "2".
The other observation I made was that it doesn't take much of a consequence at all to make this work. My initial intuition was to scale the "punishment" by the severity of the incident, but really, a 5-10 minute timeout does just as much good as a longer one, and is much easier to apply. Anything you can do reliably and without effort would, in my case, almost always work; the point is to avoid the power struggle.
One of the children in my care always pushes the issue to a power struggle, regardless of how much one seeks to avoid it. They're very clever and try to manipulate the situation to apportion blame to the care-giver when it should rest with themselves. Frustrating and impressive in equal measure.
We scale timeouts according to age, 1min per year. Truly longer timeouts (for us) just result in punishment then ending up focusing on the timeout and the subject's failure to abide by the rules of timeout; which causes escalation.
The other observation I made was that it doesn't take much of a consequence at all to make this work. My initial intuition was to scale the "punishment" by the severity of the incident, but really, a 5-10 minute timeout does just as much good as a longer one, and is much easier to apply. Anything you can do reliably and without effort would, in my case, almost always work; the point is to avoid the power struggle.