The primal-dual algorithm may be a useful approach in this scenario. A one-sentence summary: starting from an initial feasible solution, we find an optimal direction to go in to increase the objective function until we run into a boundary, then find a new direction to go in.
Compared to the simplex method, this has more complicated iterations (each one will need several steps of the simplex method) but each iteration can yield a greater improvement. As with many other methods, we can stop early to get a feasible but not optimal solution. I think it's a good choice in this setting because:
- It makes more progress at the beginning: early iterations are faster and often produce more improvement than later ones, whereas the simplex method is more uniform.
- It takes better advantage of the initial solution, which is feasible but not a corner point.
Here's a slightly more detailed description.
To be consistent with notation other people use, we're going to think of the problem you want to solve as the "dual program", and assume it is in the form $$(D): \quad \max\{\mathbf u^{\textsf T}\mathbf b : \mathbf u^{\textsf T}A \le \mathbf c^{\textsf T}\}$$
with $\mathbf u_0$ as the initial feasible solution (and $\mathbf u_1, \mathbf u_2, \dots$ as later feasible solutions).
Our goal at each iteration is to find a direction $\mathbf v$ such that for not-too-large $t > 0$, $\mathbf u_i + t \mathbf v$ is still feasible, and increases the objective function quickly. Then we will find the largest $t^*$ that preserves feasibility, and let $\mathbf u_{i+1} = \mathbf u_i + t^* \mathbf v$.
To find $\mathbf v$, we write down a smaller linear program called the "restricted dual". For this, let $J$ be the set of dual constraints that are tight at $\mathbf u_i$ (that is, $(\mathbf u_i)^{\textsf T}A_J = \mathbf c_J^{\textsf T}$). We find $\mathbf v$ by solving
$$
(RD) : \quad \max \{ \mathbf v^{\textsf T}\mathbf b : \mathbf v^{\textsf T}A_J \le \mathbf 0^{\textsf T}, \mathbf v \le \mathbf 1\}
$$
where the constraint $\mathbf v \le \mathbf 1$ is added because we're looking for a direction, and don't care about magnitude.
The reason that these are all duals is that the dual of $(RD)$, the "restricted primal" $(RP)$, is the one we actually solve to find $\mathbf v$ (using the simplex method). This is
$$
(RP) : \quad \min\{\mathbf 1^{\mathsf T}\mathbf y : A_J \mathbf x_J + I \mathbf y = \mathbf b, \mathbf x_J \ge \mathbf 0, \mathbf y \ge \mathbf 0\}.
$$
(Note that from the optimal dictionary/tableau for $(RP)$, we can find the optimal $\mathbf v$ using the reduced costs of $\mathbf y$, since the $\mathbf y$-variables are dual to the $\mathbf v \le \mathbf 1$ constraints.)
The reason to use $(RP)$ instead of $(RD)$ is that between different iterations, the previous optimal solution $(RP)$ can be taken as a starting point for the next $(RP)$: it is still feasible, even though the set of variables changes. Intuitively, $(RP)$ can be thought of as a version of a bigger problem with constraints $A\mathbf x + I\mathbf y = \mathbf b$, but most of its variables (the ones outside $J$) are "frozen" and cannot be made positive.
For more resources on this topic: I learned about the primal-dual algorithm from the book Combinatorial Optimization by Papadimitriou and Steiglitz (it's in Chapter 5). I have some old lecture notes online about the algorithm as well, which can be found here; the direct links to three lectures' worth of notes on this topic are 1, 2, 3.