A very specific limitation is that you will face an exception being thrown when you run this on a dev org or scratch org. As per the documentation:
For Developer Edition and Trial organizations, the maximum stack depth for chained jobs is 5, which means that you can chain jobs four times and the maximum number of jobs in the chain is 5, including the initial parent queueable job
Both this limitation and the throttling issue mentioned by @AdrianLarson can be avoided by ensuring that you engineer the queueable to track stack depth and to switch execution to a future method once the maximum depth is reached (switching back to queueable again after that).
This has an impact on the state that the queueable can maintain since future methods can only receive (collections of) simple data values, and you need to use the method parameters to receive and propagate that state forwards down the queue.
NB: You also want to make sure that the future invocation also does useful work, as if it were an execution of the queueable, otherwise you're wasting one of your limited daily async calls every time you switch from queueable to future.
UPDATE: Using the following code on a scratch org demonstrates the error:
public with sharing class TestQ implements Queueable {
private Integer depth = 1;
public void execute(QueueableContext param1) {
System.debug('TestQ depth is ' + depth);
depth++;
System.enqueueJob(this);
}
}
Starting this via Anonymous Apex:
System.enqueueJob(new TestQ());
After 4 successful executions the following exception is thrown:
System.AsyncException: Maximum stack depth has been reached.
System.scheduleBatch
method which has a benefit of adding delay if needed.