My previous understanding is that angr uses unicorn for instruction emulation for symbolic execution. Although, I see they also have what they call a "simulation engine" that provides a similar interface to Qiling's and allows for setting breakpoints and poking around in memory. To your point, there is definitely overlap. Qiling is much more narrowly scoped, but I think Qiling has a better understanding of the OS. It can do syscall and I/O handling for Windows, Linux, and Mac binaries regardless of what host OS you are running.
Angr is a static analysis and symbolic execution framework. It contains many components. It's built around Valgrind's VEX IR and provides an API that allows for lifting binaries from various architectures to a common IL. Angr also provides libraries to aid in CFG recovery, concolic testing, and other program analysis techniques. Angr does not do software emulation and is used mostly for static analysis.
Qiling is almost entirely dynamic. Qiling provides an API that allows you to instrument and emulate binaries. It's an extra layer on top of Unicorn (a library that can emulate CPU instructions using QEMU). Qiling contains ELF/PE/etc loaders and kernel syscall emulation. Think of it as qemu-user but with a Python API allowing you to install hooks, set breakpoints, read/write to memory, etc...
My previous understanding is that angr uses unicorn for instruction emulation for symbolic execution. Although, I see they also have what they call a "simulation engine" that provides a similar interface to Qiling's and allows for setting breakpoints and poking around in memory. To your point, there is definitely overlap. Qiling is much more narrowly scoped, but I think Qiling has a better understanding of the OS. It can do syscall and I/O handling for Windows, Linux, and Mac binaries regardless of what host OS you are running.