To solve this problem, we first need to define the decision variables and the objective function. Let's denote:
- $x$ as the number of shipping containers sent,
- $y$ as the number of cargo planes sent.

The objective is to maximize the total number of products sent overseas, which can be represented by the function $1000x + 800y$, since each shipping container can take 1000 products and each cargo plane can take 800 products.

Given constraints are:
1. The budget constraint: $5000x + 6000y \leq 20000$.
2. The shipping delay constraint: $x \leq y$.

We also know that $x$ and $y$ must be non-negative integers since they represent the number of shipping containers and cargo planes, respectively.

Here is the Gurobi code to solve this linear programming problem:

```python
from gurobipy import *

# Create a new model
m = Model("Shipping Optimization")

# Define variables
x = m.addVar(vtype=GRB.INTEGER, name="shipping_containers")
y = m.addVar(vtype=GRB.INTEGER, name="cargo_planes")

# Set the objective function to maximize the total number of products sent
m.setObjective(1000*x + 800*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5000*x + 6000*y <= 20000, "budget_constraint")
m.addConstr(x <= y, "shipping_delay_constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of shipping containers: {x.x}")
    print(f"Number of cargo planes: {y.x}")
    print(f"Total number of products sent: {1000*x.x + 800*y.x}")
else:
    print("No optimal solution found")
```