What is the difference between @BeforeTestCase and @SetupTestCase

Thank you for the question.

@ methods in Test Suite and Test Case are meant for simple test fixtures setup.

Test Listener is meant for integration and advanced execution manipulations (example).

There is no definitive boundary, but in happy scenarios, things should be designed so that the tests still execute well with or without Test Listener. Of course, whatever you use does not really matter - public APIs are and will always be maintained.