Difference between __asm__ volatile("jmp 0x0000") and ((void(*)(void))0x0000)()?
One specifically performs a JMP instruction, and the other treats it as a function call. 

Depending on the chip you're programming for it will most probably use a different instruction than JMP, and it will most probably alter some registers in some way that the JMP wouldn't.

For instance, on MIPS, it would use a JAL instruction (Jump And Link), and the return address would be placed in $ra.