I am really torn on this problem. I think using the second method is more reliable and easier to debug. Each function becomes a very clear black box. Errors are easier to catch because you can trap input errors within the function. Having the flag outside the scope of the function seems to introduce extra ambiguity into the code. Under what conditions was my function called? Where and why was my flag set? Did some logic error occur to cause the flag to be set inproperly? It also makes you have to test the validity of the flag before you call the function which can be complicated. I think removing the flag can lead to better encapsulation inside the function and error handling of state can be consistently dealt with inside the function.
But like I said I am torn the first method can be really convenient and if you have really complicated logic inside a function it can ensure consistency because of DRY. Not need to repeat really fragile and complicated functionality.
In my mind I think it depends on where you ultimately want to validate input parameters. I think avoiding flags allows for a very clear location to track down problems. Inside the black box.
Also, in addition to flags sometimes I want to know who and what is calling my function. So sometimes I add a reference id as an additional parameter.
void Submit(object data, bool isDraft, string referenceId);
Then I can know more about who is calling submit and can make tracking down errors a little easier if the want to impose rules about who should call your function and understand when in the logic flow it was called.