Functionaly speaking there (as far as i know) no difference between the two.
the true difference is in their usage (I also think that the usage of [Isolate] technically get translated to Isolate.Cleanup() ).
In both cases, the inner structures of the Isolate framework get cleaned. i.e. all set behavior and fakes are disposed of.
:!: Be advised that if the actual call to Isolate.Cleanup() is inside the test method, it might get bypassed in case the test fails.
About your second question, under most scenario there should not be any difference. However, there is some code executed (related to the testing Framework)between the end of a test and the start of the next test, and I did encounter some edge cases when some faking did effected that.
:?: Is there a special reason not to use the [Isolate] / call cleanup at the end of TearDown?
:idea: [Isolate] can also be used on the test class level. Which might be best if like me you belong to the the forgetful tribe.