Behavioral should be preferred when you are confident:
1.) it could/does have an efficient implementation.
2.) you could check and change it if needed.
One of the least used tools is sandboxing -- trying out a small coding construct examples to see what it creates. This can be massively useful. For example, using "+" works better than carry-lookahead in FPGAs. For-loops often work just fine if the logic inside the loop is simple.
Variables can be used for convenient combinatorial logic, but try to avoid inferring registers from them. It is ok, but can make the code less readable.