From the [Apex documentation][1]: "Each future method is queued and executes when system resources become available." As such, if the system resources are available, the `@future` method could execute immediately. 

I would conclude there are no guarantees the timing will look like the first timing order you asked about below:

    -start sync---call future---end sync---execute future->


This is exactly why, as you've astutely noted, the documentation states: 

> The reason why sObjects can’t be passed as arguments to future
> methods is because the sObject might change between the time you call
> the method and the time it executes. In this case, the future method
> will get the old sObject values and might overwrite them.

  [1]: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_invoking_future_methods.htm#kanchor525