Updated answer:
The default behavior of WP is exactly what you want. The problem is that you are using get_posts()
which completely ignores the sticky post behavior by forcing ignore_sticky_posts = true
(check the source). So you need only one query, just use WP_Query():
$postsList = new WP_Query([
'post_type' => 'post',
'posts_per_page' => $default_posts_per_page,
'paged' => $paged
]);
The sticky posts will be at the top and – if paginated – will be repeated again on pages ordered by their date (default ordering).
To avoid posts’ stickiness use 'ignore_sticky_posts' => true
in your query. It does not exclude the sticky posts just removes the ‘sticky behavior’ so the posts will be ordered by date (default ordering).
new WP_Query([
'post_type' => 'post',
'posts_per_page' => $default_posts_per_page,
'paged' => $paged,
'ignore_sticky_posts' => true
]);
Codex link: https://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters