The asm() directive you're trying to use is supposed to be used to 'embed' a single, properly formatted, assembler instruction - written as a C-style string of characters.
In other words, something like asm(" BCF 0,3" );
The compiler looks at that string during compile time and inserts that exact assembler instruction into your code - that's why its asking you for a constant char - it has to be a correctly formatted constant string when your code is compiled.
So what you're trying to do by building the string with sprintf during execution can't ever work.
In addition, if you look at the description of the GOTO assembler instruction for your PIC, you'll see that it takes a constant fixed value as the address to jump to.
The address forms a part of the instruction at compile time and you can't change it on-the-fly during execution.
What you're trying to do might be better served using function pointers. See C coding design - function pointers?
. But you'll need to be careful about managing & not mangling the stack.