Okay, bear with me on this one, there's a handful of answers for this:
First off, Ren'Py is Python-based. all Python statements outside of a python: block must be preceded with the $ character. You CAN define actual functions inside Python blocks (I advise using init python: blocks for these). You can call functions either as normal in python blocks or outside them by preceding them with the $ character.
Secondly,
Labels can act as GOTO or CALL, depending on what command you use to get to the label.
Jump <label> will go to the label. Under most circumstances, you will not use the return command on a label you jump to.
while Call <label> will go to the label AS A SUBROUTINE, and the return command will bring you back to where the call was done. If you have a called label and you jump from that label to another one, you can STILL use the return command as if you had not jumped.
So, if you're somewhere in label Label_A...
...and you
CALL Label_B...
...and then
JUMP to Label_C...
...and then use the RETURN command in Label_C...
...you will be back NOT in Label_B but in Label_A, since that's where the last call occurred from.
Fair bit of warning: if you have not done a Call Label command, the Return command will end the game and bring you back to the main menu.
in other words, yes, you can also fake a function definition using labels and the Ren'Py call command. I'd advise going the first route (actual Python) if you're familiar enough with the language to do so (and most of us will help if you're not).