@Andrew's answer is totally correct, except that it is not a bug but expected behavior.
Here's an example why:
where('foo', '=', 'bar')
Now there are two possibilities how Laravel could interpret (or misinterpret?) this
1. Column named bar
"Sure you want to compare the column foo with bar. Here's your SQL:"
WHERE foo = bar
2. The value "bar"
"Well obviously you want all the records where foo equals "bar". Here you go:"
WHERE foo = "bar"
So Laravel has to make a decision. And because a computer (without artificial intelligence at least) can't possibly know if you want to compare with a value or another column, the developers decided it should always compare with the value (probably because it is the functionality that's needed more)
And as you already know, whereRaw is the solution:
whereRaw('calls < maxcalls')