You certainly can change banks in the middle of code, you just need to align the jumps precisely because the program counter (the address of the code) needs to be taken into account.
Example below. It starts in bank3, does some commands, jumps to bank0, does more commands, then jumps back to bank3:
bank 3 code:
;just some code
org #0500h
mov a,r1
mov r2,a
jumptobank0:
anl p1,#0fch ;this code is at #0502h and takes 2 bytes, so the next instruction read will be at #504h in bank0
;this is #0504h and continues from bank3
mov a,r3 ;this is at #0504h and takes place when returned from bank0
mov r4,a
bank 0 code:
org #0500h
nop
nop
jumpbacktobank3
orl p1,#03h ;this code is at #0502h and takes 2 bytes, so the next instruction read will be at #504h in bank3
;this is #0504h and continues from bank3
cpl a
mov r3,a
jmp jumpbacktobank3