An even simpler way would be to include a marker to denote the end of the shell script, and the start of the data. For example, if you put this in extract.sh
#!/bin/sh
sed -E '1,/^START-OF-TAR-DATA$/d' "$0" | tar xvzf -
exit
START-OF-TAR-DATA
You can then run foobar.tar.gz.sh to self-extract. And you still get the benefit of being able to modify the shell script without needing to count lines or characters without sacrificing any compression.
There will be only one that is neither preceded by indentation nor followed by an exit code, so that it could match ^exit$, unless you contrive some hypothetical nonsense purely for the sake of contrarianism.
Any reasonable person will indent a conditional exit within the block testing its condition, and more than one unconditional exit doesn't make sense.