The % 15 is because they're using 'elif' or 'else if'; they only process each entry once and they exit the function when a successful comparison is made.
It's true that you could do this with something like:
result = ''
if x % 3 == 0: result += 'fizz'
if x % 5 == 0: result += 'buzz'
if result == '': result += str(x)
return result
to append fizz when for 15 and also continue processing and append buzz, but this requires an extra comparison to check that you did neither of those to print the number.
but note that if you do 3 comparisons, or 2 comparisons and an "extra" comparison, you've done the same number of comparisons, it's not really 'extra'
then go ahead and keep adding factors and see which results in more comparisons as we rack up the actually extra comparisons for various combinations of factors
btw and ftw, your modulo and string test example, more correct than the usual implementation, is among the most efficient:
“fizz” % 3, “buzz” % 5, what is the % 15 for?
You can blow a interviewee’s mind by saying, great, now “bang” % 7… and (hopefully!) watch the light dawn.
// why so serious? :-)