Yes, indeed, this technique was frequently used in ancient programs.
For example, many decades ago I have disassembled many Microsoft programs, like the MS-DOS Basic interpreter or Fortran compiler.
In all those Microsoft programs, there were many loops where the jump at the end of the loop jumped in the middle of the initial instruction. Thus the first execution of the loop executed different instructions than the next executions, which was used, e.g., for the loop initialization.
There were also many if-then-else structures where one of the branches ended with a jump towards the middle of some instruction, so that depending on which was the value of the condition different instructions were executed.
The instructions whose middle position was the target of a jump were usually instructions with immediate operands, so that when executed from the beginning the immediate value was treated as data, while when reached through a jump in the middle of the instruction, the immediate data was treated as an instruction opcode.