Taint engine: This engine is used to determine at every step of the binary's execution which parts of memory and registers are controllable by the user input.
This engine is more useful when you just want to see how user controlled data moves through a program.
For example during exploit development you can use the taint engine to narrow down which functions of the binary are parsing the user controlled data.
The taint engine is slighly faster and lightweight than the symbolic one.